package main

import (
	_ "baseLearning/base1/pkg" //引入某个包，但不直接使用包里的函数，而是调用该包里面的init函数
	"fmt"
)

func mainInterface() {
	chicken := Chicken{"ik"}
	cat := Cat{"阿狸"}
	sing(chicken)
	sing(cat)
	//类型断言
	var i Animal = chicken
	y := i.(Animal)
	t, ok := i.(Animal)
	i.jump()
	y.jump()
	fmt.Println(y, t, ok)
	//空接口可以保存任何类型
	Print(12)
	Print("123")
	Print(true)
	Print([]int{1, 2, 3})
	Print(make(map[string]string, 2))
	Print(12)
	Print("123")
	Print(true)
	Print([]int{1, 2, 3})
	Print(make(map[string]string, 2))

}

type data interface{}

func Print(d data) {
	fmt.Println(d)
}

// Animal 定义一个animal的接口，它有唱，跳，rap的方法
type Animal interface {
	sing()
	jump()
	rap()
}

// Chicken 需要全部实现这些接口
type Chicken struct {
	Name string
}

func (c Chicken) sing() {
	fmt.Println("chicken 唱")
}

func (c Chicken) jump() {
	fmt.Println("chicken 跳")
}
func (c Chicken) rap() {
	fmt.Println("chicken rap")
}

// Cat 需要全部实现这些接口
type Cat struct {
	Name string
}

func (c Cat) sing() {
	fmt.Println("cat 唱")
}

func (c Cat) jump() {
	fmt.Println("cat 跳")
}
func (c Cat) rap() {
	fmt.Println("cat rap")
}

func sing(obj Animal) {
	obj.sing()
}
